/* Standard includes. */
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>

/* Kernel includes. */
#include "FreeRTOS.h"
#include <task.h>

#include "util.h"


DebugLevel debugLevel = DEBUG_LEVEL;


// 假设这是获取当前debug level的函数
DebugLevel getCurrentDebugLevel() {
    // 实现获取当前debug level的逻辑
    return debugLevel;
}


// 假设这是您的获取当前时间的函数，返回从系统启动以来的滴答数
TickType_t GetSystemTicks(void) {
    return xTaskGetTickCount();
}

// 格式化时间为易读的字符串
void PrintTimestamp(char *buffer, size_t bufSize) {
    TickType_t ticks = GetSystemTicks();
    // printf("ticks: %ld\n", ticks);   // 用于调试，实际应用中可以删除
    // 假设您的系统以每秒1000滴答运行（1kHz）
    uint32_t seconds = ticks / 1000;
    uint32_t milliseconds = (ticks % 1000); // 保留一位小数
    // printf("seconds=%ld milliseconds=%ld\n", seconds, milliseconds);   // 用于调试，实际应用中可以删除

    snprintf(buffer, bufSize, "[%u.%03u] ", seconds, milliseconds);
    // printf("PrintTimestamp: %s\r\n", buffer);
}
// 带时间戳和标签的打印函数
void printWithTimestamp(const char *tag, const DebugLevel requiredLevel, const char *format, ...) {
    char timestampBuffer[20];
    char printBuffer[256]; // 根据需要调整缓冲区大小

    // 获取时间戳并存储在timestampBuffer
    // printf("format=%s", format);
    // 检查是否满足所需的debug level
    if (getCurrentDebugLevel() < requiredLevel) {
        // 如果当前debug level低于所需的debug level，则不执行打印
        return;
    }

    PrintTimestamp(timestampBuffer, sizeof(timestampBuffer));

    // 使用va_list处理可变参数列表
    va_list args;
    va_start(args, format);
    vsnprintf(printBuffer, sizeof(printBuffer), format, args);
    va_end(args);

    // 打印时间戳、标签和消息
    if(requiredLevel == DEBUG_LEVEL_ERROR){
        printf("%s<%s>.ERR: %s\n", timestampBuffer, tag, printBuffer);
    }else if(requiredLevel == DEBUG_LEVEL_WARNING){
        printf("%s<%s>.WARN: %s\n", timestampBuffer, tag, printBuffer);
    }else if(requiredLevel == DEBUG_LEVEL_INFO){
        printf("%s<%s>.INFO: %s\n", timestampBuffer, tag, printBuffer);
    }else if (requiredLevel == DEBUG_LEVEL_DEBUG){
        printf("%s<%s>.DEBUG: %s\n", timestampBuffer, tag, printBuffer);
    }else if (requiredLevel == DEBUG_LEVEL_VERBOSE){
        printf("%s<%s>.VERBOSE: %s\n", timestampBuffer, tag, printBuffer);
    }else{
        printf("Invalid debug level\n");
    } 

}
// // 示例任务
// void vTaskCode( void *pvParameters ) {
//     while(1) {
//         // 使用带时间戳的打印函数
//         printWithTimestamp("Hello, FreeRTOS!");

//         vTaskDelay(pdMS_TO_TICKS(1000)); // 假设1秒的延时
//     }
// }

/**
 * 获取指定延迟类型的持续时间。
 * 
 * 本函数遍历一个延迟配置数组，寻找与指定延迟类型匹配的配置项，如果找到，则返回该配置项的持续时间。
 * 如果没有找到匹配的延迟类型，则返回0。
 * 
 * @param delayType 指定的延迟类型。
 * @param delays 指向延迟配置数组的指针。
 * @param arraySize 延迟配置数组的大小。
 * @return 指定延迟类型的持续时间，如果没有找到匹配的类型，则返回0。
 */
uint32_t GetDelayDuration(uint8_t delayType, const DelayConfig* delays, size_t arraySize) {
    // 遍历延迟配置数组，查找匹配的延迟类型
    for (size_t i = 0; i < arraySize; ++i) {
        if (delays[i].type == delayType) {
            return (uint32_t)*delays[i].data; // 找到匹配项，返回持续时间
        }
    }
    // 没有找到匹配的延迟类型，返回0
    return 0;
}

// test 数据类型
void sendReportTest(ReportTest* report_type, void* report, void(*callback)(void *, void *)) {
    if(callback != NULL){
        callback(report_type, report);
    }
}